package top.hmtools.mapper.plus.mysql;

import java.util.Set;

import org.apache.ibatis.mapping.MappedStatement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;

public class DeleteMapperPlusProvider extends MapperTemplate{
	
	private final Logger logger = LoggerFactory.getLogger(DeleteMapperPlusProvider.class);

	public DeleteMapperPlusProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
		super(mapperClass, mapperHelper);
	}

	/**
	 * 指定主键名称（Java类字段名字符串），主键集合，删除指定记录集合
	 * <br><b>注意入参异常造成误删除全部数据的危害</b>
	 * @param ms
	 * @return
	 */
	public String delSomeByPk(MappedStatement ms){
		final Class<?> entityClass = getEntityClass(ms);
		
		StringBuffer sql = new StringBuffer();
		sql.append(SqlHelper.deleteFromTable(entityClass, tableName(entityClass)));
		
		//组装条件
		sql.append(" where ");
		
		//获取所有该表的主键
        Set<EntityColumn> pkColumns = EntityHelper.getPKColumns(entityClass);
        for(EntityColumn column:pkColumns){
        	StringBuffer sqlPart = new StringBuffer();
        	sqlPart.append("<if test=\" key == '{{key}}' and (ids != null and ids.length > 0) \">");
        	sqlPart.append("  "+column.getColumn()+"  IN  ");
        	sqlPart.append("(");
        	sqlPart.append("<foreach collection=\"ids\" item=\"id\"  index=\"index\" open=\"\" separator=\",\" close=\"\">");
        	sqlPart.append("<if test = \"id != null and id != ''\" >");
        	sqlPart.append("#{id}");
        	sqlPart.append("</if>");
        	sqlPart.append("</foreach>");
        	sqlPart.append(")");
        	sqlPart.append("</if>");
        	sql.append(sqlPart.toString().replaceAll("\\{\\{key\\}\\}", column.getProperty()));
        }
		
		
		//入参为空的处理
		sql.append("<if test=\" key == null or key == '' or ids == null or (ids != null and ids.length &lt; 1) \">");
		sql.append("limit 0");
		sql.append("</if>");
		
		//TODO 如果id参数集合中，只有部分为空，则使得全部不删除
//		sql.append("<foreach collection=\"ids\" item=\"id\"  index=\"index\" open=\"\" separator=\",\" close=\"\">");
//		sql.append("<if test = \"id == null or id == ''\" >");
//		sql.append("<bind name=\"limitFlag\" value=\"'true'\" />");
//		sql.append("</if>");
//		sql.append("</foreach>");
		
		if(this.logger.isDebugEnabled()){
			this.logger.debug(Thread.currentThread().getStackTrace()[1].getMethodName()+"  :  "+sql.toString());
		}
		return sql.toString();
	}
	
	/**
	 * 根据条件删除
	 * <br><b>注意入参异常造成误删除全部数据的危害</b>
	 * @param ms
	 * @return
	 */
	public String delSomeByCondition(MappedStatement ms) {
		final Class<?> entityClass = getEntityClass(ms);

		StringBuffer sql = new StringBuffer();
		sql.append(SqlHelper.deleteFromTable(entityClass, tableName(entityClass)));
		// 组装条件
		sql.append(" where ");
		sql.append("<trim prefixOverrides=\"AND |OR \">");
		Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
		for(EntityColumn column:columns){
			sql.append(SqlHelper.getIfNotNull(column, " AND " + column.getColumnEqualsHolder(), true));
		}
		sql.append("</trim>");
		
		//入参 条件对象中所有属性为空的处理  "<bind name=\"limitFlag\" value=\"'true'\" />"
//		sql.append("<if test=\"");
//		int index = 0;
//		for(EntityColumn column:columns){
//			sql.append("(");
//			sql.append(column.getProperty()+" == null ");
//			if(column.getJavaType().equals(String.class)){
//				sql.append(" or "+column.getProperty()+" == ''");
//			}
//			sql.append(")");
//			
//			index++;
//			if(index < columns.size()){
//				sql.append("and");
//			}
//		}
//		sql.append("\">");
//		sql.append("<bind name=\"limitFlag\" value=\"'true'\" />");
//		sql.append("</if>");
//		
//		sql.append("<if test=\"limitFlag = 'true'\">");
//		sql.append("limit 0");
//		sql.append("</if>");
		
		if(this.logger.isDebugEnabled()){
			this.logger.debug(Thread.currentThread().getStackTrace()[1].getMethodName()+"  :  "+sql.toString());
		}
		return sql.toString();
	}
}
